package com.demo.java.OD151_200.OD158;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【关联端口组合并&端口合并】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145759865
 */
public class OdMain {
    public static void main(String[] args) {
        // 创建 Scanner 对象读取输入
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 读取端口组数
        scanner.nextLine(); // 读取换行符
        List<TreeSet<Integer>> groups = new ArrayList<>();  // 存储所有端口组

        // 读取每个端口组的信息
        for (int i = 0; i < n; i++) {
            String[] ports = scanner.nextLine().split(","); // 拆分输入的端口信息
            TreeSet<Integer> group = new TreeSet<>();  // 使用 TreeSet 自动排序和去重
            for (String port : ports) {
                group.add(Integer.parseInt(port));  // 将端口加入集合
            }
            groups.add(group);  // 将当前端口组加入列表
        }

        // 持续合并端口组，直到没有更多可以合并的组
        while (merge(groups)) ;

        // 输出最终合并后的端口组
        System.out.println(groups);
    }

    // 合并端口组的函数
    private static boolean merge(List<TreeSet<Integer>> groups) {
        for (int i = 0; i < groups.size(); i++) {
            for (int j = i + 1; j < groups.size(); j++) {
                TreeSet<Integer> group1 = groups.get(i);
                TreeSet<Integer> group2 = groups.get(j);
                int count = 0;
                // 比较两个端口组，计算共有的端口数
                for (int port : group1) {
                    if (group2.contains(port)) {
                        count++;
                        if (count >= 2) {
                            group1.addAll(group2);  // 合并两个端口组
                            groups.remove(j);  // 删除已经合并的端口组
                            return true;  // 成功合并，退出并重新检查
                        }
                    }
                }
            }
        }
        return false;  // 没有更多可以合并的端口组
    }
}